package io.gitee.caoxiaoyu97.mybatis;// package com.hundsun.tbsp.bfts.other.base.mybatis;
//
// import org.apache.ibatis.executor.resultset.ResultSetHandler;
// import org.apache.ibatis.plugin.Interceptor;
// import org.apache.ibatis.plugin.Intercepts;
// import org.apache.ibatis.plugin.Invocation;
// import org.apache.ibatis.plugin.Plugin;
// import org.apache.ibatis.plugin.Signature;
//
// import java.lang.reflect.Field;
// import java.sql.Statement;
// import java.util.HashMap;
// import java.util.List;
// import java.util.Map;
// import java.util.Properties;
//
// @Intercepts({
//     @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
// })
// public class DecryptResultInterceptor implements Interceptor {
//
//     @Override
//     public Object intercept(Invocation invocation) throws Throwable {
//         ResultSetHandler resultSetHandler = (ResultSetHandler) invocation.getTarget();
//         Statement statement = (Statement) invocation.getArgs()[0];
//
//         List<Object> results = (List<Object>) invocation.proceed();
//
//         if (results != null) {
//             for (Object result : results) {
//                 if (result instanceof Map) {
//                     decryptMap((Map<?, ?>) result);
//                 } else {
//                     decryptObject(result);
//                 }
//             }
//         }
//         return results;
//     }
//
//     private void decryptMap(Map<?, ?> map) {
//         Map<Object, Object> decryptedMap = new HashMap<>();
//         for (Map.Entry<?, ?> entry : map.entrySet()) {
//             Object key = entry.getKey();
//             Object value = entry.getValue();
//             if (value instanceof String) {
//                 String strValue = (String) value;
//                 // 方式一：判断是否以 ${sm4} 开头
//                 if (strValue.startsWith("${sm4}")) {
//                     decryptedMap.put(key, sm4CryptoUtil.decrypt(strValue));
//                 }
//                 // 方式二：根据字段名判断
//                 else if (key instanceof String && cryptoFieldConfig.shouldDecrypt(key.toString())) {
//                     // 可选：即使没有标记，也尝试解密（需谨慎）
//                 }
//             } else {
//                 decryptedMap.put(key, value);
//             }
//         }
//         ((Map) map).clear();
//         ((Map) map).putAll(decryptedMap);
//     }
//
//     private void decryptObject(Object obj) throws IllegalAccessException {
//         Field[] fields = obj.getClass().getDeclaredFields();
//         for (Field field : fields) {
//             if (cryptoFieldConfig.shouldDecrypt(field.getName())) {
//                 field.setAccessible(true);
//                 Object value = field.get(obj);
//                 if (value instanceof String) {
//                     String strValue = (String) value;
//                     if (strValue.startsWith("${sm4}")) {
//                         field.set(obj, sm4CryptoUtil.decrypt(strValue));
//                     }
//                 }
//             }
//         }
//     }
//
//     @Override
//     public Object plugin(Object target) {
//         return Plugin.wrap(target, this);
//     }
//
//     @Override
//     public void setProperties(Properties properties) {
//     }
// }